CodeDeployにおいて、特定のEC2へのデプロイが失敗した時の対処方法
困っていた内容
[stderr].FileNotFoundError: [Errno 2] No such file or directory: ‘./docker-compose.yml’
どう対応すればいいの?
CLI コマンドで --ignore-application-stop-failures オプションを付与してデプロイを実行して下さい。
本事象は最後に成功したデプロイ ID d-***でデプロイしたリビジョンに含まれる Infrastructure/codedeploy/stop_server.sh が ./docker-compose.yml を見つけられないために発生していると考えられます。
CodeDeploy エージェントは ApplicationStop, BeforeBlockTraffic および AfterBlockTraffic フェーズにおいて、最後に成功したデプロイに含まれる appspec ファイルに記述されたスクリプトを実行します。 デプロイメントグループにおいて最後に成功したデプロイ ID は d-***でしたので、この際にデプロイしたリビジョンに含まれる Infrastructure/codedeploy/stop_server.sh が相対パス ./docker-compose.yml を見つけられていない状況と考えられます。
よって、--ignore-application-stop-failures オプションを付与してデプロイいただけますと、ApplicationStop フェーズにおけるエラーを無視してデプロイを続行しますので、お試しください。
■ 補足
弊社ブログにも参考記事が載っていましたので、あわせてご確認下さい。
CodeDeployのApplicationStopイベントフックはどう実行される?
参考資料
EC2/オンプレミスのデプロイに関する問題のトラブルシューティング
失敗した ApplicationStop BeforeBlockTraffic、 AfterBlockTraffic またはデプロイライフサイクルイベントのトラブルシューティング
- CodeDeploy コンソールを使用してデプロイを作成します。[デプロイの作成] ページの [ApplicationStop ライフサイクルイベントの失敗] で、[インスタンスのこのライフサイクルイベントが失敗しても、インスタンスへのデプロイを失敗させない] を選択します。
- AWS CLI を使用して create-deployment コマンドを呼び出し、
--ignore-application-stop-failures
オプションを含めます。
--ignore-application-stop-failures | --no-ignore-application-stop-failures (boolean) If true, then if an ApplicationStop , BeforeBlockTraffic , or AfterBlockTraffic deployment lifecycle event to an instance fails, then the deployment continues to the next deployment lifecycle event.